/**
 * 动态路由工具类
 * 用于根据后端返回的菜单数据动态生成路由
 */
export class DynamicRoutes {
    /**
     * 根据后端返回的菜单数据生成路由配置
     * @param {Array} menuData 后端返回的菜单数据
     * @returns {Array} 路由配置数组
     */
    static generateRoutes(menuData) {
        const routes = []

        menuData.forEach(menu => {
            const route = this.createRoute(menu)
            if (route) {
                routes.push(route)
            }
        })

        return routes
    }

    /**
     * 创建单个路由配置
     * @param {Object} menu 菜单项数据
     * @returns {Object|null} 路由配置对象
     */
    static createRoute(menu) {
        // 如果是外链，直接返回null
        if (menu.isExternal) {
            return null
        } 
        const route = {
            path: menu.path,
            name: menu.name,
            meta: {
                title: menu.title,
                icon: menu.icon,
                type: menu.type || 'tabs', // 默认使用tabs显示方式
                hidden: menu.hidden || false,
                keepAlive: menu.keepAlive || false
            }
        }

        // 如果有子菜单，使用Home组件作为布局
        if (menu.children && menu.children.length > 0) {
            route.component = () => import('@/views/Home.vue')
            route.children = menu.children.map(child => this.createRoute(child)).filter(Boolean)
        } else {
            // 叶子节点，需要动态加载组件
            if (menu.component) {
                route.component = this.loadComponent(menu.component)
            }
        }

        return route
    }

    /**
     * 动态加载组件
     * @param {string} componentPath 组件路径，如 'views/system/User'
     * @returns {Function} 组件加载函数
     */
    static loadComponent(componentPath) {
        // 移除开头的斜杠
        const path = componentPath.startsWith('/') ? componentPath.slice(1) : componentPath

        // 如果路径以views开头，直接使用
        if (path.startsWith('views/')) {
            return () => import(`@/${path}.vue`)
        }

        // 否则添加views前缀
        return () => import(`@/views/${path}.vue`)
    }

    /**
     * 添加路由到路由器
     * @param {Object} router Vue Router实例
     * @param {Array} routes 路由配置数组
     */
    static addRoutes(router, routes) {
        routes.forEach(route => {
            router.addRoute(route)
        })
    } 
    /**
     * 清除动态路由
     * @param {Object} router Vue Router实例
     * @param {Array} routeNames 要清除的路由名称数组
     */
    static removeRoutes(router, routeNames) {
        routeNames.forEach(name => {
            router.removeRoute(name)
        })
    }
} 
/**
 * 示例：后端返回的菜单数据结构
 *
 * const menuData = [
 *     {
 *         path: '/system',
 *         name: 'System',
 *         title: '系统管理',
 *         icon: 'Setting',
 *         children: [
 *             {
 *                 path: '/system/user',
 *                 name: 'User',
 *                 title: '用户管理',
 *                 icon: 'User',
 *                 component: 'views/system/User',
 *                 type: 'tabs' // 可选值：0：'tabs'(标签页显示)默认  或 1 'dialog'(弹窗显示)，默认为'0'
 *             },
 *             {
 *                 path: '/system/role',
 *                 name: 'Role',
 *                 title: '角色管理',
 *                 icon: 'UserFilled',
 *                 component: 'views/system/Role',
 *                 type: 'dialog' // 使用弹窗方式显示编辑等操作
 *             }
 *         ]
 *     }
 * ]
 */
